package com.sxbbc.common.basics.service.solr;

import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.context.annotation.Configuration;

import com.sxbbc.common.basics.exceptions.ThrowJsonException;
import com.sxbbc.common.basics.service.solr.entity.Solrpage;

/**
 * 搜索引擎工具类
 *
 * @param <T>
 * @author arno
 */
@Configuration
public class SolrUtils<T> {

    private HttpSolrClient httpSolrClient;

    public SolrUtils() {

    }

    public SolrUtils(HttpSolrClient httpSolrClient) {
        this.httpSolrClient = httpSolrClient;
    }

    /**
     * 添加 /编辑 solr数据
     *
     * @param t
     */
    public void addBean(T t) {
        try {
            httpSolrClient.addBean(t);
            httpSolrClient.commit();
        } catch (Exception e) {
            e.printStackTrace();
            throw new ThrowJsonException("添加搜索缓存失败");
        }
    }

    /**
     * 删除数据根据主键
     *
     * @param id
     */
    public void deleteById(String id) {
        try {
            httpSolrClient.deleteById(id);
            httpSolrClient.commit();
        } catch (Exception e) {
            throw new ThrowJsonException("删除搜索缓存失败");
        }
    }

    /**
     * 根据ID查询单个
     *
     * @param queryText 查询条件
     * @return com.sxbbc.common.basics.service.solr.entity.Solrpage<T>
     */
    public Solrpage<T> selectById(String queryText) {
        Solrpage<T> solr = new Solrpage<T>();
        SolrQuery query = new SolrQuery();
        try {
            query.setQuery(queryText);
            QueryResponse queryResponse = httpSolrClient.query(query);
            SolrDocumentList results = queryResponse.getResults();
            solr.setResults(results);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ThrowJsonException("查询单个失败");
        }
        return solr;
    }

    /**
     * 清空数据
     */
    public void clearAll() {
        try {
            httpSolrClient.deleteByQuery("*:*");
            httpSolrClient.commit();
        } catch (Exception e) {
            throw new ThrowJsonException("清空搜索缓存失败");
        }
    }

    /**
     * 高亮查询
     *
     * @param query     查询对象
     * @param querytext 搜索语句
     * @param cpage     当前页数
     * @param pageSize  每页条数
     * @param clazz     反射对象
     * @return
     */
    public Solrpage<T> queryList(SolrQuery query, String querytext, int cpage, Class<?> clazz) {
        Solrpage<T> solr = new Solrpage<T>();
        try {
            query.setQuery(querytext);
            // 计算开始记录数
            int pageSize = solr.getPageSize();
            Integer startIndex = (cpage - 1) * pageSize;
            query.setStart(startIndex);
            query.setRows(pageSize);
            // 高亮颜色
            // 前缀
            query.setHighlight(true);
            // 这里如果用thymeleaf模板，css样式生效需要加th:utext...
            query.setHighlightSimplePre("<font style='color:red'>");
            // 后缀
            query.setHighlightSimplePost("</font>");
            // 得到查询的响应对象
            QueryResponse queryResponse = httpSolrClient.query(query);
            // 普通查询
            SolrDocumentList results = queryResponse.getResults();
            // k是id,内部的map的key是域名,其value是高亮的值集合
            Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
            solr.setCpage(cpage);// 设置当前页
            solr.setPageSize(pageSize);// 设置每页数量
            solr.setTotalrows(results.getNumFound());// 设置一共多少条数据 计算一共多少页
            solr.setResults(results);
            solr.setHighlighting(highlighting);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ThrowJsonException("查询失败");
        }
        return solr;
    }
    
    /**
     * 高亮查询
     *
     * @param query     查询对象
     * @param querytext 搜索语句
     * @param cpage     当前页数
     * @param pageSize  每页条数
     * @param clazz     反射对象
     * @return
     */
    public Solrpage<T> queryList(SolrQuery query, String querytext, int cpage, Integer size, Class<?> clazz) {
        Solrpage<T> solr = new Solrpage<T>();
        try {
            query.setQuery(querytext);
            int pageSize = 0;
            // 计算开始记录数
            if (size != null) {
            	pageSize = size;
            } else {
            	pageSize = solr.getPageSize();
            }
            Integer startIndex = (cpage - 1) * pageSize;
            query.setStart(startIndex);
            query.setRows(pageSize);
            // 高亮颜色
            // 前缀
            query.setHighlight(true);
            // 这里如果用thymeleaf模板，css样式生效需要加th:utext...
            query.setHighlightSimplePre("<font style='color:red'>");
            // 后缀
            query.setHighlightSimplePost("</font>");
            // 得到查询的响应对象
            QueryResponse queryResponse = httpSolrClient.query(query);
            // 普通查询
            SolrDocumentList results = queryResponse.getResults();
            // k是id,内部的map的key是域名,其value是高亮的值集合
            Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
            solr.setCpage(cpage);// 设置当前页
            solr.setPageSize(pageSize);// 设置每页数量
            solr.setTotalrows(results.getNumFound());// 设置一共多少条数据 计算一共多少页
            solr.setResults(results);
            solr.setHighlighting(highlighting);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ThrowJsonException("查询失败");
        }
        return solr;
    }


}